package co.com.bean.datosmaestros;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ejb.Stateless;

import co.com.smart.maestro.infraestructure.dto.DatoMaestroDTO;
import co.com.smart.maestro.infraestructure.dto.MaestrosMedicoDTO;
import co.com.smart.maestro.infraestructure.dto.ResponseJson;
import co.com.smart.mapper.Mapper;
import co.com.smart.persistence.entity.DatosMaestrosFacadeLocal;
import co.com.smart.persistence.entity.dto.SmartDatosMaestro;
import co.com.smart.session.DelegateContextEJB;
import co.com.smart.utilidades.Constantes;

/**
 * Session Bean implementation class DatosMaestrosBean
 */
@Stateless(mappedName = "ejb/DatosMaestrosBean")
public class DatosMaestrosBean implements DatosMaestrosBeanLocal{
	
	private DatosMaestrosFacadeLocal facade;
	/**
	 * Default constructor. 
	 */
	public DatosMaestrosBean() {
		facade = DelegateContextEJB.getDatosMaestrosFacadeLocal();
	}
	@Override
	public ResponseJson insertarDatosMaestros(DatoMaestroDTO datos_maestroDTO) {
		ResponseJson response = new ResponseJson(); 
		try {
			facade.create(Mapper.mapperDtoToSmartDatosMaestro(datos_maestroDTO));
			response.setCodigo(Constantes.StatusResponse.OK.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Datos maestros almacenado.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Datos maestros almacenado.");
		} catch (Throwable e) {
			System.err.println("Error insertando el Datos maestros -> " + e.getMessage());
			response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible almacenar el Datos maestros.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
		}
		return response ;
	}
	@Override
	public ResponseJson editDatosMaestros(DatoMaestroDTO datos_maestroDTO) {
		ResponseJson response = new ResponseJson(); 
		try {
			datos_maestroDTO.setFhmodificacion(new Date());
			facade.edit(Mapper.mapperDtoToSmartDatosMaestro(datos_maestroDTO));
			response.setCodigo(Constantes.StatusResponse.OK.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Datos_maestro editado.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Datos_maestro editado.");
		} catch (Throwable e) {
			System.err.println("Error editando el Datos_maestro -> " + e.getMessage());
			response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible editar el Datos_maestro.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
		}

		return response ;
	}
	@Override
	public ResponseJson removeDatosMaestros(DatoMaestroDTO datos_maestroDTO, boolean logic) {
		ResponseJson response = new ResponseJson(); 
		if(logic){
			try {
				datos_maestroDTO.setFhretiro(new Date());
				datos_maestroDTO.setFhmodificacion(new Date());
				facade.edit(Mapper.mapperDtoToSmartDatosMaestro(datos_maestroDTO));
				response.setCodigo(Constantes.StatusResponse.OK.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "datos_maestro inactivado");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "datos_maestro inactivado.");
			} catch (Throwable e) {
				System.err.println("Error editando el datos_maestro -> " + e.getMessage());
				response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible inactivar el departamento.");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
			}
		}else{
			try {
				facade.remove(Mapper.mapperDtoToSmartDatosMaestro(datos_maestroDTO));
				response.setCodigo(Constantes.StatusResponse.OK.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Datos maestros eliminado");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Datos maestros eliminado.");
			} catch (Throwable e) {
				System.err.println("Error eliminando el Datos maestros -> " + e.getMessage());
				response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible eliminar el Datos maestros.");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
			}
		}
		return response ;
	}
	@Override
	public List<DatoMaestroDTO>  consultarAllDatosMaestros() {
		List<DatoMaestroDTO> dp = new ArrayList<DatoMaestroDTO>();
		for (SmartDatosMaestro entity : facade.findAll()) {
			if(entity.getSmFhretiro() == null){
				dp.add(Mapper.mapperSmartDatos_maestroDTO(entity));
			}
		}
		return dp;
	}
	@Override
	public DatoMaestroDTO consultarDatosMaestrosId(DatoMaestroDTO datos_maestroDTO) {
		DatoMaestroDTO dp = new DatoMaestroDTO();
		SmartDatosMaestro entity  = facade.find(datos_maestroDTO.getScdatmestro());
		if(entity != null && entity.getSmFhretiro() == null){
			dp = Mapper.mapperSmartDatos_maestroDTO(entity);
		}
		return dp;
	}
	
	@Override
	public MaestrosMedicoDTO consultarDatosMaestros() {
		
		MaestrosMedicoDTO maestros = new MaestrosMedicoDTO();
		
		
		List<DatoMaestroDTO> listaTipoDocumento = new ArrayList<DatoMaestroDTO>();
		for (SmartDatosMaestro entity : facade.consultarDatosMaestroCd(Constantes.Maestros.TIPO_DOCUMENTO.getCodigo())) {
			listaTipoDocumento.add(Mapper.mapperSmartDatos_maestroDTO(entity));
		}
		maestros.setListaTipoDocumento(listaTipoDocumento);
		
		List<DatoMaestroDTO> listaTipoServicio = new ArrayList<DatoMaestroDTO>();
		for (SmartDatosMaestro entity : facade.consultarDatosMaestroCd(Constantes.Maestros.TIPO_SERVICIO.getCodigo())) {
			listaTipoServicio.add(Mapper.mapperSmartDatos_maestroDTO(entity));
		}
		maestros.setListaTipoServicio(listaTipoServicio);
		
		List<DatoMaestroDTO> listaNivel = new ArrayList<DatoMaestroDTO>();
		for (SmartDatosMaestro entity : facade.consultarDatosMaestroCd(Constantes.Maestros.NIVEL.getCodigo())) {
			listaNivel.add(Mapper.mapperSmartDatos_maestroDTO(entity));
		}
		maestros.setListaNivel(listaNivel);
		
		List<DatoMaestroDTO> listaTipoAfiliacion = new ArrayList<DatoMaestroDTO>();
		for (SmartDatosMaestro entity : facade.consultarDatosMaestroCd(Constantes.Maestros.TIPO_AFILIACION.getCodigo())) {
			listaTipoAfiliacion.add(Mapper.mapperSmartDatos_maestroDTO(entity));
		}
		maestros.setListaTipoAfiliacion(listaTipoAfiliacion);
		
		List<DatoMaestroDTO> listaPlan = new ArrayList<DatoMaestroDTO>();
		for (SmartDatosMaestro entity : facade.consultarDatosMaestroCd(Constantes.Maestros.PLAN.getCodigo())) {
			listaPlan.add(Mapper.mapperSmartDatos_maestroDTO(entity));
		}
		maestros.setListaPlan(listaPlan);
		
		return maestros;
	}

	
}
